#include "pinctrl.h"
#include <stdio.h>
#include "osal_debug.h"
#include "common_def.h"
#include "soc_osal.h"    // osal 内核所有头文件引用合集
#include "app_init.h"
#include "gpio.h"


#define THREAD_STACK_SIZE  0x1000
#define DELAY_TIME_1S  5000
#define GPIO_PIN_IN1    9
#define GPIO_PIN_IN2    10
#define GPIO_PIN_IN3    11
#define GPIO_PIN_IN4    12

#define HIGH 1
#define LOW 0

int waitTime = 5000;    // 电机转动速度
int moveLen = 300;      // 移动长度

//
void go() {
   uapi_gpio_set_val(GPIO_PIN_IN1, HIGH);
   osal_udelay(waitTime);
   cleanOne();
   uapi_gpio_set_val(GPIO_PIN_IN2, HIGH);
   osal_udelay(waitTime);
   cleanOne();
   uapi_gpio_set_val(GPIO_PIN_IN3, HIGH);
   osal_udelay(waitTime);
   cleanOne();
   uapi_gpio_set_val(GPIO_PIN_IN4, HIGH);
   osal_udelay(waitTime);
   cleanOne();
}


void back() {
   uapi_gpio_set_val(GPIO_PIN_IN4, HIGH);
   osal_udelay(waitTime);
   cleanOne();  
   uapi_gpio_set_val(GPIO_PIN_IN3, HIGH);
   osal_udelay(waitTime);
   cleanOne();
   uapi_gpio_set_val(GPIO_PIN_IN2, HIGH);
   osal_udelay(waitTime);
   cleanOne();
   uapi_gpio_set_val(GPIO_PIN_IN1, HIGH);
   osal_udelay(waitTime);
   cleanOne();
}

void cleanOne() {
  uapi_gpio_set_val(GPIO_PIN_IN1, LOW);
  uapi_gpio_set_val(GPIO_PIN_IN2, LOW);
  uapi_gpio_set_val(GPIO_PIN_IN3, LOW);
  uapi_gpio_set_val(GPIO_PIN_IN4, LOW);
}

void stepper_thread(void *arg)
{
    UNUSED(arg);
    uapi_pin_init();
    uapi_gpio_init();

    uapi_pin_set_mode(GPIO_PIN_IN1, 0);
    uapi_gpio_set_dir(GPIO_PIN_IN1, GPIO_DIRECTION_OUTPUT);

    uapi_pin_set_mode(GPIO_PIN_IN2, 0);
    uapi_gpio_set_dir(GPIO_PIN_IN2, GPIO_DIRECTION_OUTPUT);

    uapi_pin_set_mode(GPIO_PIN_IN3, 0);
    uapi_gpio_set_dir(GPIO_PIN_IN3, GPIO_DIRECTION_OUTPUT);

    uapi_pin_set_mode(GPIO_PIN_IN4, 0);
    uapi_gpio_set_dir(GPIO_PIN_IN4, GPIO_DIRECTION_OUTPUT);

    int distance = 0;
    while (1) {
        for(int i = 0; i < moveLen; i++) {
            go(); 
        }
        for(int i = 0; i < moveLen; i++) {
            back(); 
        }
        osal_msleep(DELAY_TIME_1S);
    }
}

static void stepper_entry(void)
{
    osal_kthread_lock();

    // 创建控制stepper的线程
    osal_task * task = osal_kthread_create((osal_kthread_handler)stepper_thread, NULL, "stepper_thread", THREAD_STACK_SIZE);
    if (task != NULL)
    {
        printf("[Stepper Example] Success to create stepper_thread!\r\n");
    } else {
        printf("[Stepper Example] Failed to create stepper_thread!\r\n");
    }
    
    osal_kthread_unlock();
}

app_run(stepper_entry);